home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / utilities / icon / forceicon18.lha / ForceIcon / Source / LoadPrefs.h < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-27  |  4.0 KB  |  161 lines

  1.  
  2. /**********************************************************************/
  3. /*                          Load in settings                          */
  4. /**********************************************************************/
  5. static BOOL DoLoadPrefs(struct FIconSema *FIconSema, char *PrefsName);
  6. static BOOL LoadPrefs(struct FIconSema *FIconSema, char *TryName)
  7. {
  8.     if(TryName)
  9.         return(DoLoadPrefs(FIconSema, TryName));
  10.  
  11.     else
  12.     {
  13.             // Try env: first, then envarc:
  14.         if(!DoLoadPrefs(FIconSema, "ENV:ForceIcon_prefs.iff"))
  15.             return(DoLoadPrefs(FIconSema, "ENVARC:ForceIcon_prefs.iff"));
  16.         else
  17.             return(TRUE);
  18.     }
  19. }
  20. static BOOL DoLoadPrefs(struct FIconSema *FIconSema, char *PrefsName)
  21. {
  22.     struct    IFFHandle    *PrefsHandle;
  23.     struct    StoredProperty    *SP;
  24.     UWORD    *VersCheck;
  25.     LONG    Error;
  26.     BOOL    GoOn = FALSE;
  27.  
  28.         // Initialize Lists first
  29.  
  30.     NewList(&FIconSema->VolumeList);
  31.     FIconSema->VolumeList.lh_Type    = 0;
  32.  
  33.     NewList(&FIconSema->AppIconList);
  34.     FIconSema->AppIconList.lh_Type    = 0;
  35.  
  36.  
  37.         // Get Prefs Handle
  38.  
  39.     if((PrefsHandle = AllocIFF()))
  40.     {
  41.             // Open file
  42.  
  43.         if((PrefsHandle->iff_Stream = Open(PrefsName, MODE_OLDFILE)))
  44.         {
  45.                 // Init handle
  46.  
  47.             InitIFFasDOS(PrefsHandle);
  48.  
  49.                 // Open Handle
  50.  
  51.             if(!(Error = OpenIFF(PrefsHandle, IFFF_READ)))
  52.             {
  53.                     // Search for version chunk
  54.  
  55.                 if(!(Error = PropChunk(PrefsHandle, 'FOIC', 'VERS')))
  56.                 {
  57.                         // Stop at prefs
  58.  
  59.                     if(!(Error = StopChunk(PrefsHandle, 'FOIC', 'PREF')))
  60.                     {
  61.                             // Start parsing
  62.  
  63.                         if(!(Error = ParseIFF(PrefsHandle, IFFPARSE_SCAN)))
  64.                         {
  65.                                 // Try to find version chunk
  66.  
  67.                             if((SP = FindProp(PrefsHandle, 'FOIC', 'VERS')))
  68.                             {
  69.                                 VersCheck = (UWORD *)SP->sp_Data;
  70.  
  71.                                     // Check Version number
  72.  
  73.                                 if(((*VersCheck) <= VERNUM) && ((*(VersCheck+1)) <= REVNUM))
  74.                                 {
  75.                                     struct    VolEntry    *ThisEntry;
  76.                                     UWORD            NumEntries,
  77.                                                 EntryType,
  78.                                                 MultiPlyer    = 4;
  79.                                     BOOL            NoErr        = TRUE;
  80.  
  81.                                         // For versions >= 1.4 use larger arrays
  82.  
  83.                                     if(((*VersCheck) >= 1) && ((*(VersCheck + 1)) >= 4))
  84.                                         MultiPlyer    = 36;
  85.  
  86.                                         // Read in prefs
  87.  
  88.                                     if((Error = ReadChunkBytes(PrefsHandle, &NumEntries, sizeof(UWORD))) == sizeof(UWORD))
  89.                                     {
  90.                                         while(NumEntries-- && NoErr)
  91.                                         {
  92.                                             if((ThisEntry = AllocVecPool(FIconSema, sizeof(struct VolEntry))))
  93.                                             {
  94.                                                 if((Error = ReadChunkBytes(PrefsHandle, &EntryType, sizeof(UWORD))) == sizeof(UWORD))
  95.                                                 {
  96.                                                     ThisEntry->Link.ln_Type = EntryType;
  97.  
  98.                                                     if((Error = ReadChunkBytes(PrefsHandle, &ThisEntry->VolName, 130)) == 130)
  99.                                                     {
  100.                                                         if((Error = ReadChunkBytes(PrefsHandle, &ThisEntry->IconName, 256)) == 256)
  101.                                                         {
  102.                                                             if((Error = ReadChunkBytes(PrefsHandle, &ThisEntry->Left, (sizeof(UWORD) * MultiPlyer))) != (sizeof(UWORD) * MultiPlyer))
  103.                                                                 NoErr = FALSE;
  104.                                                             else
  105.                                                             {
  106.                                                                 if(!ThisEntry->WinWidth)
  107.                                                                     ThisEntry->WinWidth    = 50;
  108.  
  109.                                                                 if(!ThisEntry->WinHeight)
  110.                                                                     ThisEntry->WinHeight    = 50;
  111.                                                             }
  112.  
  113.                                                             ThisEntry->Link.ln_Name = ThisEntry->VolName;
  114.  
  115.                                                             if(EntryType == FICON_APPICON)
  116.                                                             {
  117.                                                                 AddTail(&FIconSema->AppIconList, (struct Node *)ThisEntry);
  118.                                                                 FIconSema->AppIconList.lh_Type++;
  119.                                                             }
  120.                                                             else
  121.                                                             {
  122.                                                                 AddTail(&FIconSema->VolumeList, (struct Node *)ThisEntry);
  123.                                                                 FIconSema->VolumeList.lh_Type++;
  124.                                                             }
  125.                                                         }
  126.                                                     }
  127.                                                 }
  128.                                             }
  129.                                             else
  130.                                                 NoErr = FALSE;
  131.                                         }
  132.                                         GoOn = NoErr;
  133.                                     }
  134.  
  135.                                     if(!NoErr)
  136.                                         Error = IoErr();
  137.                                 }
  138.                             }
  139.                         }
  140.                     }
  141.                 }
  142.                 CloseIFF(PrefsHandle);
  143.             }
  144.  
  145.             Close(PrefsHandle->iff_Stream);
  146.         }
  147.         else
  148.             Error = 0;
  149.  
  150.         FreeIFF(PrefsHandle);
  151.     }
  152.     else
  153.         Error = ERR_NOMEM;
  154.  
  155.     if(!GoOn && Error != 0 && Error != ERROR_OBJECT_NOT_FOUND)
  156.         DisplayError(Error, (ULONG)PrefsName);
  157.  
  158.  
  159.     return(GoOn);
  160. }
  161.